

/////DI_DO   DIO模块 对应门禁传感器
/*-----------------------------------------------------------------------------------------------
{"head":{"gatewayId":"gw_1C3283005078","msgId":14,"timeStamp":0,"cmd":"readAttr"},"data":{"privAddr":24,"channel":1,"nodeType":1,"mask":"01","classMask":"11"}}
Tcp_ch1_TxData copy done
gw_ktj socket send done
10:35:54- ETH_1 local_ktj_js Rx: len=858
{"head":{"gatewayId":"gw_1C3283005078","replaceId":"","msgId":14,"timeStamp":1736908554,"response":"readAttr"},
"data":{"nodeType":1,"channel":1,"privAddr":24,"mac":"FFFFFFFFFFFF","name":"io_1_19","pid":"4002","totalFrame":1,"currFrame":1,"totalAttr":8,"itemCnt":8},
"attrLst":[{"name":"do1","lable":"继电器0","class":25,"dpid":16,"val":0,"type":0},
{"name":"do2","lable":"继电器1","class":25,"dpid":17,"val":0,"type":0},
{"name":"do3","lable":"继电器2","class":25,"dpid":18,"val":0,"type":0},
{"name":"do4","lable":"继电器3","class":25,"dpid":19,"val":0,"type":0},
{"name":"di1","lable":"输入0","class":25,"dpid":64,"val":0,"type":0},
{"name":"di2","lable":"输入1","class":25,"dpid":65,"val":0,"type":0},
{"name":"di3","lable":"输入2","class":25,"dpid":66,"val":0,"type":0},
{"name":"di4","lable":"输入3","class":25,"dpid":67,"val":0,"type":0}]}
-----------------------------------------------------------------------------------------------*/


//#include "dev_DIDO.h"


#ifndef __DEV_DIDO_H__
#define __DEV_DIDO_H__

#include "dev_module.h"
#include "iot_message.pb.h"
#include <stdint.h>
#include "iot_node.h"


#define  dev_dido_ver0_enable        (0U)   


#define  dev_dido_max_dev_addr        (245U)      // 设备地址	R/W	否	配置参数	uint8_t	0~255
#define  dev_dido_max_channel          (31U)      // 设备通道编号	R/W	否	配置参数	uint8_t	0~31

#define   DEV_DIDO_NUM     (8)     //-----dido的通道总数 ----目前最大的有32路的dido设备-------


// #define DEFAULT_PID              (0xC27A)               //默认pid
// #define DEFAULT_HARDWARE_STR     "2024-08-01 V1000"     //默认硬件版本号
// #define DEFAULT_PRODUCT_TYPE     "ml307r-sd-200"        //默认产品类型
// #define DEFAULT_MANUFACTURE_INFO "2024-09-29-p001"      //默认生产信息




/*-----------------------------------------------------------------------------------------------

									
0x0801	软件版本	RO	否	软件版本	string	最大32字节			
0x0802	硬件版本	RO	否	硬件版本	string	最大32字节			
0x0803	产品型号	RO	否	产品型号	string	最大32字节			
0x0804	生产信息	RO	否	生产信息	string	最大32字节			生产日期，生产批次等信息
0x0805	厂家信息	RO	否		string	最大32字节			生产商名称信息

-----------------------------------------------------------------------------------------*/

/////-----设备类型----
//#define   DEV_DIDO_TYPE     (0xD006)     //液位传感器（D006H） 


////以下枚举的取值 需要结合 数组 dev_dido_iot_id_table[dev_dido_index_end]的下标进行关联的定义---同步更新----
typedef enum{

    dev_dido_index_run_data_begin      = 0,    // 设备运行参数
    dev_dido_index_run_data_end        = 8,
    dev_dido_index_config_data_begin   = 5,    // 设备配置参数-------------超过 8个时需要分帧处理
    dev_dido_index_factory_info_begin  = 15,   // 设备出厂信息
    dev_dido_index_end = 19+1,

} dev_dido_attr_index_e;


#pragma pack(1)

//0x0500	0=低电平-无效，1=高电平--有效
//bit0：第01路开关量输出状态
typedef union{
    struct{

        uint32_t ch1 : 1;    //第01路
        uint32_t ch2 : 1;	   //第02路
        uint32_t ch3 : 1;	  
        uint32_t ch4 : 1;	
        uint32_t ch5 : 1;	  
        uint32_t ch6 : 1;	
        uint32_t ch7 : 1;	  
        uint32_t ch8 : 1;	
        uint32_t ch9 : 1;	  
        uint32_t ch10 : 1;	
        uint32_t ch11 : 1;	  
        uint32_t ch12 : 1;	
        uint32_t ch13 : 1;	  
        uint32_t ch14 : 1;	
        uint32_t ch15 : 1;	  
        uint32_t ch16 : 1;	

        uint32_t ch17 : 1;    
        uint32_t ch18 : 1;	
        uint32_t ch19 : 1;	  
        uint32_t ch20 : 1;	
        uint32_t ch21 : 1;	  
        uint32_t ch22 : 1;	
        uint32_t ch23 : 1;	  
        uint32_t ch24 : 1;	
        uint32_t ch25 : 1;	  
        uint32_t ch26 : 1;	
        uint32_t ch27 : 1;	  
        uint32_t ch28 : 1;	
        uint32_t ch29 : 1;	  
        uint32_t ch30 : 1;	
        uint32_t ch31 : 1;	  
        uint32_t ch32 : 1;	
    }bit;
    uint32_t value;
} dev_u32_bit_u;

//0x0500	0=低电平-无效，1=高电平--有效
//bit0：第01路开关量输出状态
typedef union{
  struct{

      uint16_t ch1 : 1;    //第01路
      uint16_t ch2 : 1;	   //第02路
      uint16_t ch3 : 1;	  
      uint16_t ch4 : 1;	
      uint16_t ch5 : 1;	  
      uint16_t ch6 : 1;	
      uint16_t ch7 : 1;	  
      uint16_t ch8 : 1;	
      uint16_t ch9 : 1;	  
      uint16_t ch10 : 1;	
      uint16_t ch11 : 1;	  
      uint16_t ch12 : 1;	
      uint16_t ch13 : 1;	  
      uint16_t ch14 : 1;	
      uint16_t ch15 : 1;	  
      uint16_t ch16 : 1;	

  }bit;
  uint16_t value;
} dev_u16_bit_u;


// "Bit3-Bit0:DI 模块工作模式
// 0： DI 输入；1： 计数；2： 锁存
// Bit4:计数或锁存触发方式
// 0： 下降沿； 1： 上升沿
//Bit15-Bit5:保留"

typedef enum{
   DEV_DIDO_MODE_IN    = 0,   //0： DI 输入
   DEV_DIDO_MODE_COUNT = 1,   //1： 计数；
   DEV_DIDO_MODE_LATCH = 2,   //2： 锁存

} dev_dido_mode_e;


typedef union{
    struct{

        uint32_t mode : 4;      //DI 模块工作模式
        uint32_t edge : 1;	    //计数或锁存触发方式--- 0： 下降沿； 1： 上升沿
        uint32_t res  : 1;	
    }bit;
    uint32_t value;
} dev_dido_work_cfg_u;




//液位传感器（D006H）的数据
///---------RO 数据--------//
// 0x0540	IO输出状态
// 0x0541	IO输入状态
// 0x0542	IO锁存状态

typedef struct{

 //   dev_u32_bit_u   output;  // 0x0540	IO输出状态								
 //dev_u16_bit_u   input;   // 0x0541	IO输入状态	
 dev_u32_bit_u   input;   // 0x0541	IO输入状态						
 //   dev_u32_bit_u   latch;   // 0x0542	IO锁存状态
                             
} dev_dido_data_t;



///---------R/W	配置参数--------//
typedef struct{

    uint8_t   addr;                  //设备地址  0~255			
    uint8_t   channel;               //0x0602	设备通道编号	0~31	

    uint16_t  do1 ;    //通道1数字输出--	R/W	否	运行参数	
    uint16_t  do2 ;    //通道2数字输出--	R/W	否	运行参数	
    uint16_t  do3 ;    //通道3数字输出--	R/W	否	运行参数	
    uint16_t  do4 ;    //通道4数字输出--	R/W	否	运行参数	

    // dev_u32_bit_u  output_enable;  // 0x0640	IO输出使能
    // dev_u32_bit_u  latch_enable;   // 0x0641	IO输入锁存使能
    // dev_u32_bit_u  count_enable;   // 0x0642	IO输入计数使能
    // dev_u32_bit_u  latch_clean;    // 0x0643	清通道锁存
    // dev_u32_bit_u  count_clean;    // 0x0644	清通道计数


    dev_u16_bit_u almEn;             // 545	1349	almEn	告警使能	R/W	是	配置参数	uint16_t
    dev_u16_bit_u almCond;           // 546	1350	almCond	告警条件	R/W	是	配置参数	uint16_t
    dev_u16_bit_u almStatus;         // 547	1351	almStatus	告警状态	R/W		运行参数	uint16_t
    
} dev_dido_config_t;




//---配置节点信息----------


typedef union
{
	struct{	
		
	  uint16_t online                  :1;	  //节点在线标志-----1:在线，0:离线，

	  uint16_t res                     :15;  
		
	}bit;
	
  uint16_t all;

} dev_dido_node_flags_u;



//#define   DEV_DIDO_NODE_NUM_MAX    (255U)  
#define   DEV_DIDO_NODE_NUM_MAX    ( NODE_NUM_MAX )     ///与配置节点总数相关-----



typedef struct{
    dev_dido_data_t         data;
    dev_dido_config_t       config;
    dev_attr_com_info_t     info;

    dev_dido_node_flags_u  flags;
  //  char   dev_name_str[32];   
} dev_dido_attr_t;


#pragma pack()

extern const  uint16_t  dev_dido_iot_id_table[dev_dido_index_end];

/**
 * @brief 
 * 
 */
void dev_dido_param_init(void);

uint8_t dev_dido_add_obj(uint8_t idx,uint8_t channel,uint8_t addr);


/**
 * @brief 
 * 
 * @param in idx 
 * @return dev_dido_attr_t ==NULL 查询出错,   !NULL 查询ok
 */
dev_dido_attr_t*  dev_dido_get_obj(uint8_t idx) ;  //dev_dido_attr_get


/**
 * @brief dev_dido_set_obj() 赋值节点数据
 * 
 * @param in idx
 * @param in p_attr
 * @return 0=失败，1=成功 
 */
uint8_t  dev_dido_set_obj(uint8_t idx,dev_dido_attr_t* p_attr )  ;



  //  dev_dido_index_run_data_begin      = 0,    // 设备运行参数
  //  dev_dido_index_config_data_begin   = 3,    // 设备配置参数
/**
 * @brief 根据下标，获取iot_id 的编号
 * 
 * @param idx 
 */
uint16_t  dev_dido_get_iot_id(uint8_t idx);


/**
 * @brief 
 * 
 * @param attr_id 
 * @param attr_out 
 */
void dev_dido_get_attr(uint8_t idx,uint16_t attr_id, IotModel* attr_out);


/**
 * @brief 
 * 
 * @param attr_in 
 * @return uint8_t 
 */
uint8_t dev_dido_set_attr(uint8_t idx,IotModel* attr_in);


void dev_dido_test_tick_min(uint8_t idx);

////刷新节点运行数据
void dev_dido_update_tick_min(uint8_t idx,int8_t temper ,uint32_t dev_dido );

void dev_dido_obj_update(uint8_t idx,dev_dido_attr_t* pliq_in  );




#endif //------__DEV_DIDO_H__




















